package com.my.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @author liangxin
 * @since 08/08/2019
 */
public class jinzhiUtils {

    //int -> 二进制  十进制整数对应的二进制形式
    public static void int2Binary(InputStream in) {
//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        int num = 0;
        try {
            String s = br.readLine();
            num = Integer.parseInt(s);
        } catch (NumberFormatException e) {
            System.out.println("传入字符串错误！");
        } catch (IOException e) {
            e.getMessage();
        }
        int array[] = new int[20];
        int i = 0;
        while (num != 0) {
            try {
                array[i] = num % 2;
                num /= 2;
                i++;
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("传入字符过大！");
                System.exit(-1);
            }
        }
        for (int j = i - 1; j >= 0; j--)
            System.out.print(array[j] + " ");
    }

    /** //用移位的方式打印出一个十进制整数的十六进制形式。
     * 提示：按每4个二进制位对整数进行移位和去高位处理，得到的结果就是十六进制数的一位，然
     * 后按下面三种方式之一（作为作业，要求每种方式都用到）计算出一个十六进制数值对应的十六进制形式：
     * （1）0-9之间的数值直接加上字符'0'，9以上的数值减去10以后再加上字符'A'
     * （2）定义一个数组，其中包含0-F这些字符，然后用要计算的数值作为数组的索引号，即可获得其对应的十六进制数据。
     * （3）Character.forDigit静态方法可以将一个十六进制的数字转变成其对应的字符表示形式，例如，根据数值15返回字符'F'
     */
    public static void int2hex16(int num) {
        int temp = 0;
        int[] array = new int[8];
        System.out.println(num);
        for (int i = 0; i < 8; i++) {
            temp = num & 15;
            num = num >> 4;
            array[i] = temp;
        }
        System.out.println("第一种方法:" + int2hex16_1(array));
        System.out.println("第二种方法:" + int2hex16_2(array));
        System.out.println("第三种方法:" + int2hex16_3(array));
    }
    public static String int2hex16_1(int[] array) {
        String str = "";
        char ch = 0;
        char a = 0;
        for (int i = 0; i < 8; i++) {
            if (array[i] <= 9) {
                a = (char) ('0' + array[i]);
                str = a + str;
            } else {
                ch = (char) ((array[i] - 10) + 'a');
                str = ch + str;
            }
        }
        return str;
    }

    public static String int2hex16_2(int[] array) {
        String str = "";
        char[] ch = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        for (int i = 0; i < 8; i++) {
            str = ch[array[i]] + str;
        }
        return str;
    }

    public static String int2hex16_3(int[] array) {
        String str = "";
        for (int i = 0; i < 8; i++) {
            str = Character.forDigit(array[i], 16) + str;
        }
        return str;
    }

}
